import axios from 'axios';
import { ElMessage, ElMessageBox } from 'element-plus'; // 引入 ElMessage
import { getToken } from "@/utils/auth";
import store from '../store'

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'

// 创建一个 Axios 实例
const service = axios.create({
    baseURL: '/api', // 设置基本的请求地址
    timeout: 10000, // 请求超时时间
});

// 请求拦截器
service.interceptors.request.use(
    async config => {
        // 在发送请求之前做些什么
        if (getToken()) {
            config.headers['Authorization'] = "Bearer " + getToken() // 让每个请求携带自定义token 请根据实际情况自行修改
            // console.log("打印token:"+getToken());
        }
        // get请求映射params参数
        if (config.method === 'get' && config.params) {
            let url = config.url + '?';
            for (const propName of Object.keys(config.params)) {
                const value = config.params[propName];
                var part = encodeURIComponent(propName) + "=";
                if (value !== null && typeof (value) !== "undefined") {
                    if (typeof value === 'object') {
                        for (const key of Object.keys(value)) {
                            let params = propName + '[' + key + ']';
                            var subPart = encodeURIComponent(params) + "=";
                            url += subPart + encodeURIComponent(value[key]) + "&";
                        }
                    } else {
                        url += part + encodeURIComponent(value) + "&";
                    }
                }
            }
            url = url.slice(0, -1);
            config.params = {};
            config.url = url;
        }
        return config
    },
    error => {
        // 对请求错误做些什么
        ElMessage.error("特丽丽被玩坏了(¯﹃¯)");
        return Promise.reject(error);
    }
);

// 响应拦截器
service.interceptors.response.use(
    response => {
        return response;
    },
    error => {
        if (error.response.status) {
            switch (error.response.status) {
                case 401:
                    // 401: 未登录                
                    // 未登录则跳转登录页面，并携带当前页面的路径                
                    // 在登录成功后返回当前页面，这一步需要在登录页操作。
                    // 修改当前的登录状态
                    ElMessageBox.confirm('您尚未登录，是否返回首页？', '提示', {
                        confirmButtonText: '确定',
                        cancelButtonText: '取消',
                        type: 'warning'
                    }).then(() => {
                        // 用户点击确定，跳转到首页
                        store.commit("initData");
                        localStorage.clear();
                        localStorage.removeItem("Authorization");
                        window.location.href = "/";
                    }).catch(() => {
                        // 用户点击取消，可以选择留在当前页面或其他操作

                    });
                    break
                case 403:
                    // 403 token过期                
                    // 登录过期对用户进行提示                
                    // 清除本地token和清空vuex中token对象                
                    // 跳转登录页面 
                    ElMessageBox.confirm('登陆状态过期，是否返回首页？', '提示', {
                        confirmButtonText: '确定',
                        cancelButtonText: '取消',
                        type: 'warning'
                    }).then(() => {
                        // 用户点击确定，跳转到首页
                        store.commit("initData");
                        localStorage.clear();
                        localStorage.removeItem("Authorization");
                        window.location.href = "/";
                    }).catch(() => {
                        // 用户点击取消，可以选择留在当前页面或其他操作

                    });
                    break
                case 404:
                    // 404请求不存在 
                    break;
                // 其他错误，直接抛出错误提示                
                default:
            }
            return Promise.reject(error.response);
        }
        return Promise.reject(error);
    }
);

// 封装请求方法
const request = (config) => {
    return new Promise((resolve, reject) => {
        service(config)
            .then(response => {
                // 请求成功，根据 code 判断
                if (response.data.code === 1) {
                    // 请求成功，返回数据
                    resolve(response.data);
                } else {
                    // 请求失败，打印错误信息
                    ElMessage.error(response.data.msg || '请求失败');
                    // 抛出包含错误信息的 Error 对象
                    reject(new Error(response.data.msg || '请求失败'));
                }
            })
            .catch(error => {
                // 请求异常，打印错误信息
                ElMessage.error(error.message || '请求异常');
                // 抛出包含错误信息的 Error 对象
                reject(new Error(error.message || '请求异常'));
            });
    });
};

export default request;